package Demo02;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * @ClassName Test
 * @Description 上下文关键字：管道-过滤器
 * 特点是：前一个函数的返回值作为下一个函数的参数来使用
 * 函数是有返回值和参数的
 * 补充：范型==》就是规范数据类型。
 * @Author 李明忠
 * @Version 1.0
 */
@SuppressWarnings("all")
public class Test{
    /**
     * 1.文本输入
     * @Description 以文件名作为参数，返回文件中的内容所存放的集合initStr的地址
     * @return  ArrayList<String> 集合
     * @param String filePath 文件路径
     */
    public static ArrayList<String> input(String filePath){

        //定义集合存放输入的文本
        ArrayList<String> initStr = null;


        //使用文件路径创建文件管道
        //使用try()-catch语句可以使得文件自己关闭资源
        try (
                //创建文件缓冲字符输入流（提高效率）
                BufferedReader br = new BufferedReader(new FileReader(filePath));
        ){
            //业务逻辑

            //创建集合
            initStr = new ArrayList<>();
            //存入每一行
            String line;
            //读入文件并将其存入initStr集合
            while((line = br.readLine()) !=null){
                initStr.add(line);//添加没一行
            }

        } catch (Exception e){
            e.printStackTrace();
        }
        return initStr;
    }

    /**
     *  2.循环移动
     * @Description 对集合initStr中数据进行循环移动 因此将此作为函数参数
     * @return ArrayList<String>循环移动后的数据放入新的集合
     * @param initStr存放输入的数据
     */
    public static ArrayList<String> cycMove(ArrayList<String> initStr){

        //定义一个集合存放循环移动和存放排序后的文本
        ArrayList<String> moveStr = null;
        //怎么样来实现循环移动？
        /**
         * 现在集合中每一个元素都是一个字符串
         * 1.我先取出字符串
         * 2.将字符串以空格切割成为字符数组
         * 3.将每一个字符数组进行循环移动
         * 4.最后将循环移动后的字符串存入新 的集合moveStr
         */
        //创建moveStr集合用于存放处理后的数据
        moveStr = new ArrayList<>();

        for (int i = 0; i < initStr.size(); i++) {
            //先取出字符串 将字符串以空格切割成为字符数组
            String[] str = initStr.get(i).split(" ");


            /*****************循环移动算法***************/
            //对str中没一个元素进行循环移动
            for (int j = 0; j < str.length; j++) {
                //创建一个中间数组用于暂时存放循环移动后的数据
                //StringBuffer好处是你不用考虑开辟多大而且他有追加函数
                StringBuffer temp = new StringBuffer();
                for (int k = j; k < str.length; k++) {
                    //k控制插入节点
                    temp.append(str[k]).append(" ");
                }
                for (int k = 0; k < j; k++) {
                    temp.append(str[k]).append(" ");
                }
                //最后将这个StringBuffer temp.toString()转为字符串存入到moveStr集合
                moveStr.add(temp.toString());
            }
            /****************************************/
        }
        //最后将moveStr返回
        return moveStr;
    }


    /**
     *  3.排序
     * @Description 对集合moveStr中数据进行循环移动 因此将此作为函数参数
     * @return ArrayList<String> 排序后的数据任然在moveStr中并将其返回
     * @param moveStr存放循环移动后的数据
     */
    public static ArrayList<String> strSort(ArrayList<String> moveStr){
        //算法很简单使用冒泡排序对moveStr中的元素进行排序就可以了
        for (int i = 0; i < moveStr.size() - 1; i++) {
            for (int j = 0; j < moveStr.size() - 1 - i; j++) {
                if(moveStr.get(j).compareTo(moveStr.get(j+1)) > 0){
                    String temp = moveStr.get(j);
                    //替换集合中元素的相互覆盖只能使用set方法用于替换之前的数据
                    moveStr.set(j,moveStr.get(j+1));
                    moveStr.set(j + 1,temp);
                }
            }
        }
        return moveStr;
    }

    /**
     * 4.输出
     * @Description 对集合moveStr中打印输出
     * @return void
     * @param moveStr存放排序后的数据，将其输出
     */
    public static void output(ArrayList<String> moveStr){
        System.out.println("=========上下文关键字处理结果=========");
        //使用for-each遍历
        for (String s : moveStr){
            System.out.println(s);
        }
        System.out.println("===============end=================");
    }
    public static void main(String[] args) {
        //输入文件路径 text/test.txt
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入文件路径：");
        String filePath = scanner.nextLine();
        //1.文本输入
        ArrayList<String> initStr = input(filePath);
        //2.循环移动
        ArrayList<String> moveStr = cycMove(initStr);
        //3.排序
        ArrayList<String> moveStr2 = strSort(moveStr);
        //4.输出
        output(moveStr2);
    }
}





